class_name HThrowableWeapon
extends HWeapon

## 投掷武器类
## 继承自HWeapon，专门处理可投掷武器的属性和行为
## 负责投掷物理、轨迹计算等投掷武器特有的功能

# 投掷武器特有属性
var throw_force: float = 10.0  # 投掷力度
var gravity_scale: float = 1.0  # 重力影响系数
var bounce_count: int = 0  # 可弹跳次数
var explosion_radius: float = 0.0  # 爆炸半径（0表示无爆炸）
var projectile_scene_path: String = ""  # 投掷物实体场景路径

## 重写武器使用函数（新接口）
## 实现投掷武器的使用逻辑
## @param context: 物品使用上下文
func item_use(context: ItemUseContext):
	if not can_use(context):
		return
	
	print("使用投掷武器: ", name)
	
	# 创建并发射投掷物
	create_and_launch_projectile(context)
	
	# 减少耐久度
	reduce_durability()

## 创建并发射投掷物
## @param context: 物品使用上下文
func create_and_launch_projectile(context: ItemUseContext):
	# 加载投掷物场景
	var projectile_scene = load(projectile_scene_path)
	if not projectile_scene:
		print("错误：无法加载投掷物场景: ", projectile_scene_path)
		return
	
	# 实例化投掷物
	var projectile = projectile_scene.instantiate()
	if not projectile:
		print("错误：无法实例化投掷物")
		return
	
	# 获取发射起始位置和方向
	var start_position = context.world_position
	var throw_direction = _get_throw_direction_from_context(context)
	
	# 添加到场景中（添加到使用者的父节点下）
	var parent_node = context.user_entity.attach_node.get_parent()
	if parent_node:
		parent_node.add_child(projectile)
	else:
		print("错误：无法找到父节点")
		projectile.queue_free()
		return
	
	# 设置投掷物位置
	projectile.global_position = start_position
	
	# 初始化投掷物参数
	var item_data = create_throw_data()
	projectile.initialize_from_item(item_data, context.user_entity)
	
	# 计算并设置发射速度
	var launch_velocity = calculate_launch_velocity(throw_direction)
	projectile.launch_with_velocity(launch_velocity)
	
	print("投掷物已发射，起始位置: ", start_position, " 投掷方向: ", throw_direction)

## 从上下文获取投掷方向
## 基于基类上下文的目标位置计算投掷方向
## @param context: 物品使用上下文
## @return Vector3: 投掷方向向量
func _get_throw_direction_from_context(context: ItemUseContext) -> Vector3:
	# 尝试从目标位置计算方向
	if context.world_position.distance_to(context.target_position) > 0.1:
		var direction = (context.target_position - context.world_position).normalized()
		return direction
	
	# 如果目标位置无效，使用默认前方向
	return Vector3.FORWARD

## 计算发射速度
## 基于投掷方向计算投掷速度
## @param throw_direction: 投掷方向向量（应为标准化向量）
## @return Vector3: 发射速度向量
func calculate_launch_velocity(throw_direction: Vector3) -> Vector3:
	# 确保方向向量已标准化
	var normalized_direction = throw_direction.normalized()
	
	# 直接使用投掷方向乘以投掷力度
	var velocity = normalized_direction * throw_force
	
	return velocity

## 创建投掷数据
## @return Dictionary: 包含投掷所需的所有参数
func create_throw_data() -> Dictionary:
	return {
		"force": throw_force,
		"gravity_scale": gravity_scale,
		"bounce_count": bounce_count,
		"explosion_radius": explosion_radius,
		"projectile_scene": projectile_scene_path,
		"damage": damage
	}

## 计算投掷轨迹
## 基于投掷方向计算轨迹
## @param start_pos: 投掷起始位置
## @param throw_direction: 投掷方向向量
## @return Array: 轨迹点数组
func calculate_trajectory(start_pos: Vector3, throw_direction: Vector3) -> Array:
	var trajectory_points = []
	var time_step = 0.1
	var max_time = 5.0  # 最大模拟时间
	
	# 获取初始速度向量
	var initial_velocity = throw_direction.normalized() * throw_force
	
	# 模拟轨迹
	for i in range(int(max_time / time_step)):
		var t = i * time_step
		var pos = start_pos + initial_velocity * t
		pos.y -= 0.5 * 9.8 * gravity_scale * t * t  # 重力影响
		trajectory_points.append(pos)
		
		# 如果轨迹点过低，停止计算
		if pos.y < start_pos.y - 20.0:
			break
	
	return trajectory_points

## 检查是否可以投掷到目标位置
## @param start_pos: 起始位置
## @param target_pos: 目标位置
## @return bool: 是否可以投掷到目标
func can_throw_to_target(start_pos: Vector3, target_pos: Vector3) -> bool:
	var distance = start_pos.distance_to(target_pos)
	var max_range = calculate_max_range()
	return distance <= max_range

## 计算最大投掷距离
## 基于投掷力度计算理论最大距离
## @return float: 最大投掷距离
func calculate_max_range() -> float:
	# 简化计算：基于投掷力度的线性估算
	# 在第一人称射击中，通常不需要复杂的弹道计算
	return throw_force * 2.0

## 重写load_data方法
## 加载投掷武器特有数据
func load_data(data: Dictionary = {}):
	super.load_data(data)
	
	# 加载投掷武器特有属性
	throw_force = data.get("throw_force", 10.0)
	gravity_scale = data.get("gravity_scale", 1.0)
	bounce_count = data.get("bounce_count", 0)
	explosion_radius = data.get("explosion_radius", 0.0)
	projectile_scene_path = data.get("projectile_scene_path", "")

## 重写save_data方法
## 保存投掷武器特有数据
func save_data() -> Dictionary:
	var data = super.save_data()
	
	# 保存投掷武器特有属性
	data["throw_force"] = throw_force
	data["gravity_scale"] = gravity_scale
	data["bounce_count"] = bounce_count
	data["explosion_radius"] = explosion_radius
	data["projectile_scene_path"] = projectile_scene_path
	
	return data
